import { Provide, Inject } from '@midwayjs/core';
import { BaseService } from '@cool-midway/core';
import { InjectEntityModel } from '@midwayjs/typeorm';
import { Repository } from 'typeorm';
import { ProjectEntity } from '../entity/project';
import { ProjectMemberEntity } from '../entity/member';
import { Context } from '@midwayjs/koa';

/**
 * 项目
 */
@Provide()
export class ProjectService extends BaseService {
    @Inject()
    ctx: Context;

    @InjectEntityModel(ProjectEntity)
    projectEntity: Repository<ProjectEntity>;

    @InjectEntityModel(ProjectMemberEntity)
    projectMemberEntity: Repository<ProjectMemberEntity>;

    /**
     * 新增
     * @param param 
     */
    async add(param: any) {
        // 创建项目
        param.createUserId = this.ctx.user.id;
        param.leaderUserId = this.ctx.user.id;
        const project = await super.add(param) as ProjectEntity;
        
        // 将创建者添加为项目成员(管理员角色)
        await this.projectMemberEntity.save({
            projectId: project.id,
            userId: this.ctx.user.id,
            roleType: 1  // 管理员
        });

        return project;
    }

    /**
     * 修改
     * @param param 
     */
    async update(param: any) {
        const { id } = param;
        // 检查是否为项目管理员
        const member = await this.projectMemberEntity.findOne({
            where: {
                projectId: id,
                userId: this.ctx.user.id,
                roleType: 1
            }
        });
        if (!member) {
            throw new Error('只有项目管理员才能修改项目信息');
        }
        return super.update(param);
    }

    /**
     * 删除
     * @param ids 
     */
    async delete(ids: any) {
        // 检查是否为项目管理员，目前不区分管理员和成员，需要通过查询项目表中的创建者跟当前登录用户对比
        const project = await this.projectEntity.findOne({
            where: {
                id: ids,
                createUserId: this.ctx.user.id
            }
        });
        if (!project) {
            throw new Error('无权限! 只有项目的创建者才能删除项目!');
        }
        // 删除项目成员
        await this.projectMemberEntity.delete({ projectId: ids });
        // 删除项目
        return super.delete(ids);
    }
} 